<html>
    <head>
        <title>验证额外属性</title>
    </head>
    <body>
        <script>
             /*
                        三、验证
                                你可能希望为你定义的额外属性添加一些验证规则。
                                AddOrUpdateProperty方法选项允许两只执行验证的方式：

                                     1、你可以为属性添加数据注释特性。

                                     2、你可以编写一个操作（代码块）来执行自定义验证。


                                当你在 "自动验证的方法"（例如 控制器操作、页面处理程序方法、应用程序服务方法...）中使用对象时，验证就会起作用。
                                因此，每当验证扩展对象时，都会验证所有额外的属性。


                                1、数据注解特性

                                        所有数据注解特性都对额外属性有效.
                                        eg:

                                            ObjectExtensionManager.Instance
                                                                  .AddOrUpdateProperty<IdentityUserCreateDto,string>(
                                                                   "ScialSecurityNumber",
                                                                   options=>
                                                                   {
                                                                        options.Attributes.Add(new RequiredAttribute());

                                                                        options.Attributes.Add(
                                                                            new StringLengthAttribute(32){
                                                                                MinimumLength = 6,
                                                                                MaximumLength = 32
                                                                            }
                                                                        );
                                                                   }
                                                                  );
                                            使用此配置，如果没有提供有效的SocialSecurityNumber值，IdentityUserCreateDto对象将无效。


                                            ★、默认验证特性

                                                   当你创建某些类型的属性时，会自动添加一些特性：

                                                       ①、RequiredAttribute ：   当属性类型为非空原始类型(int\bool\DtateTime\枚举类型)时，会自动添加此特性。

                                                       ②、EnumDataTypeAttribute:  为枚举类型添加此特性，防止无效的枚举值。

                                                   如果你不想要这些特性，可以使用option.Attributes.Clear()方法清除它们。


                                2、自定义验证

                                           如果需要，你可以添加方法（委托）来验证额外属性的自定义操作：
                                                    ObjectExtensionManager.Instance
                                                                        .AddOrUpdateProperty<IdentityUserCreateDto, string>(
                                                                            "SocialSecurityNumber",
                                                                            options =>
                                                                            {
                                                                                //添加自定义验证逻辑
                                                                                options.Validators.Add(context =>
                                                                                {
                                                                                    // context是ValidationContext类的实例，提供了验证的上下文信息，例如属性值。


                                                                                    var socialSecurityNumber = context.Value as string;

                                                                                    if (socialSecurityNumber == null ||
                                                                                        socialSecurityNumber.StartsWith("X"))
                                                                                    {
                                                                                        // 添加验证错误
                                                                                        context.ValidationErrors.Add(
                                                                                            new ValidationResult(
                                                                                                "Invalid social security number: " + socialSecurityNumber,
                                                                                                new[] { "SocialSecurityNumber" }
                                                                                            )
                                                                                        );
                                                                                    }
                                                                                });
                                                                            });

                                            context.ServiceProvider可用于解决高级方案的服务依赖关系；

                                            除了为单个属性添加自定义验证逻辑外，你还可以添加在对象级别执行的自定义验证逻辑。
                                            eg：

                                                ObjectExtensionManager.Instance
                                                                        .AddOrUpdate<IdentityUserCreateDto>(objConfig =>
                                                                        {
                                                                            // 声明带有验证逻辑的额外属性
                                                                            objConfig.AddOrUpdateProperty<string>("Password", propertyConfig =>
                                                                            {
                                                                                propertyConfig.Attributes.Add(new RequiredAttribute());
                                                                            });

                                                                            // 声明带有验证规则的额外属性
                                                                            objConfig.AddOrUpdateProperty<string>("PasswordRepeat", propertyConfig =>
                                                                            {
                                                                                propertyConfig.Attributes.Add(new RequiredAttribute());
                                                                            });

                                                                            // 一个基于多个属性的自定义验证逻辑
                                                                            objConfig.Validators.Add(context =>
                                                                            {
                                                                                if (context.ValidatingObject.GetProperty<string>("Password") !=
                                                                                    context.ValidatingObject.GetProperty<string>("PasswordRepeat"))
                                                                                {
                                                                                    // 添加验证错误信息
                                                                                    context.ValidationErrors.Add(
                                                                                        new ValidationResult(  // 添加验证结果
                                                                                            "Please repeat the same password!",
                                                                                            new[] { "Password", "PasswordRepeat" }
                                                                                        )
                                                                                    );
                                                                                }
                                                                            });
                                                                        });
                    */

        </script>
    </body>
</html>